package org.groupg.mockdatabyspring.morkdata.utils;

import com.mifmif.common.regex.Generex;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.math3.exception.NumberIsTooSmallException;


/**
 * 创建数字用的工具包
 */
@Slf4j
public class CreateNumberUtils {


    /**
     * @param format 格式化数据
     *               %04d 输出：0001
     * @param d      被格式化的浮点型数字
     * @return 格式化之后的数字字符串
     */
    public synchronized static String createNumberByFormat(String format, Double d) {
        return String.format(format, d);
    }

    /**
     * 根据数据格式以及随机数创建格式化文本
     *
     * @param format 格式化字符串
     * @param regex  生成数字用的正则表达式
     * @return 字符串格式的内容（不一定会是数字，看format）
     */
    public synchronized static String createNumberByRegexFormat(String format, String regex) {
        Generex generex = new Generex(regex);
        // Generate random String
        return createNumberByFormat(format, Double.parseDouble(generex.random()));
    }

    /**
     * 根据数据长度生成满足条件的随机数（通过正则生成）
     *
     * @param length  总长度
     * @param decimal 小数位数
     * @return double 数据项
     */
    public synchronized static Double createNumberByRandom(int length, int decimal) {

        String integerStr = "0";
        if (length < (decimal + 1)) throw new NumberIsTooSmallException(decimal, length, false);
        if (length - decimal - 1 != 0) {
            Generex integerBit = new Generex("[1-9][0-9]{" + (length - decimal - 1) + "}");
            integerStr = integerBit.random();
        }
        // 整数位

        Generex decimalBit = new Generex("[0-9]{" + (decimal + "}"));
        String doubleStr = integerStr + "." + decimalBit.random();
        return Double.parseDouble(doubleStr);
    }


    /**
     * 多态处理方法 根据长度与格式返回字符串
     *
     * @param format  格式
     * @param length  总长度
     * @param decimal 小数长度
     * @return 返回满足 String.format() 的格式字符串
     */
    public synchronized static String createNumberByRandom(String format, int length, int decimal) {

        return createNumberByFormat(format, createNumberByRandom(length, decimal));
    }

}
